
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/**
 * AUTO-GENERATED FILE. DO NOT MODIFY.
 */

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
// 
//   http://www.apache.org/licenses/LICENSE-2.0
// 
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.
import * as zrUtil from 'zrender/lib/core/util.js';
import * as graphic from '../../util/graphic.js';
import * as textContain from 'zrender/lib/contain/text.js';
import * as formatUtil from '../../util/format.js';
import * as matrix from 'zrender/lib/core/matrix.js';
import * as axisHelper from '../../coord/axisHelper.js';
import AxisBuilder from '../axis/AxisBuilder.js';
import { createTextStyle } from '../../label/labelStyle.js';
export function buildElStyle(axisPointerModel) {
	var axisPointerType = axisPointerModel.get('type');
	var styleModel = axisPointerModel.getModel(axisPointerType + 'Style');
	var style;

	if (axisPointerType === 'line') {
		style = styleModel.getLineStyle();
		style.fill = null;
	} else if (axisPointerType === 'shadow') {
		style = styleModel.getAreaStyle();
		style.stroke = null;
	}

	return style;
}
/**
 * @param {Function} labelPos {align, verticalAlign, position}
 */

export function buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos) {
	var value = axisPointerModel.get('value');
	var text = getValueLabel(value, axisModel.axis, axisModel.ecModel, axisPointerModel.get('seriesDataIndices'), {
		precision: axisPointerModel.get(['label', 'precision']),
		formatter: axisPointerModel.get(['label', 'formatter'])
	});
	var labelModel = axisPointerModel.getModel('label');
	var paddings = formatUtil.normalizeCssArray(labelModel.get('padding') || 0);
	var font = labelModel.getFont();
	var textRect = textContain.getBoundingRect(text, font);
	var position = labelPos.position;
	var width = textRect.width + paddings[1] + paddings[3];
	var height = textRect.height + paddings[0] + paddings[2]; // Adjust by align.

	var align = labelPos.align;
	align === 'right' && (position[0] -= width);
	align === 'center' && (position[0] -= width / 2);
	var verticalAlign = labelPos.verticalAlign;
	verticalAlign === 'bottom' && (position[1] -= height);
	verticalAlign === 'middle' && (position[1] -= height / 2); // Not overflow ec container

	confineInContainer(position, width, height, api);
	var bgColor = labelModel.get('backgroundColor');

	if (!bgColor || bgColor === 'auto') {
		bgColor = axisModel.get(['axisLine', 'lineStyle', 'color']);
	}

	elOption.label = {
		// shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')},
		x: position[0],
		y: position[1],
		style: createTextStyle(labelModel, {
			text: text,
			font: font,
			fill: labelModel.getTextColor(),
			padding: paddings,
			backgroundColor: bgColor
		}),
		// Label should be over axisPointer.
		z2: 10
	};
} // Do not overflow ec container

function confineInContainer(position, width, height, api) {
	var viewWidth = api.getWidth();
	var viewHeight = api.getHeight();
	position[0] = Math.min(position[0] + width, viewWidth) - width;
	position[1] = Math.min(position[1] + height, viewHeight) - height;
	position[0] = Math.max(position[0], 0);
	position[1] = Math.max(position[1], 0);
}

export function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) {
	value = axis.scale.parse(value);
	var text = axis.scale.getLabel({
		value: value
	}, {
		// If `precision` is set, width can be fixed (like '12.00500'), which
		// helps to debounce when when moving label.
		precision: opt.precision
	});
	var formatter = opt.formatter;

	if (formatter) {
		var params_1 = {
			value: axisHelper.getAxisRawValue(axis, {
				value: value
			}),
			axisDimension: axis.dim,
			axisIndex: axis.index,
			seriesData: []
		};
		zrUtil.each(seriesDataIndices, function (idxItem) {
			var series = ecModel.getSeriesByIndex(idxItem.seriesIndex);
			var dataIndex = idxItem.dataIndexInside;
			var dataParams = series && series.getDataParams(dataIndex);
			dataParams && params_1.seriesData.push(dataParams);
		});

		if (zrUtil.isString(formatter)) {
			text = formatter.replace('{value}', text);
		} else if (zrUtil.isFunction(formatter)) {
			text = formatter(params_1);
		}
	}

	return text;
}
export function getTransformedPosition(axis, value, layoutInfo) {
	var transform = matrix.create();
	matrix.rotate(transform, transform, layoutInfo.rotation);
	matrix.translate(transform, transform, layoutInfo.position);
	return graphic.applyTransform([axis.dataToCoord(value), (layoutInfo.labelOffset || 0) + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0)], transform);
}
export function buildCartesianSingleLabelElOption(value, elOption, layoutInfo, axisModel, axisPointerModel, api) {
	// @ts-ignore
	var textLayout = AxisBuilder.innerTextLayout(layoutInfo.rotation, 0, layoutInfo.labelDirection);
	layoutInfo.labelMargin = axisPointerModel.get(['label', 'margin']);
	buildLabelElOption(elOption, axisModel, axisPointerModel, api, {
		position: getTransformedPosition(axisModel.axis, value, layoutInfo),
		align: textLayout.textAlign,
		verticalAlign: textLayout.textVerticalAlign
	});
}
export function makeLineShape(p1, p2, xDimIndex) {
	xDimIndex = xDimIndex || 0;
	return {
		x1: p1[xDimIndex],
		y1: p1[1 - xDimIndex],
		x2: p2[xDimIndex],
		y2: p2[1 - xDimIndex]
	};
}
export function makeRectShape(xy, wh, xDimIndex) {
	xDimIndex = xDimIndex || 0;
	return {
		x: xy[xDimIndex],
		y: xy[1 - xDimIndex],
		width: wh[xDimIndex],
		height: wh[1 - xDimIndex]
	};
}
export function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) {
	return {
		cx: cx,
		cy: cy,
		r0: r0,
		r: r,
		startAngle: startAngle,
		endAngle: endAngle,
		clockwise: true
	};
}